/**
 * @type {String}
 *
 * @properties={typeid:35,uuid:"605E1ED5-E3C6-425E-9613-C73D341C04CD"}
 */
var fTxtAdultos = null;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"CDFAA23D-835F-43A4-8C7A-EFA5CBAE2F68",variableType:4}
 */
var fMenores3 = 0;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"2254E727-4043-43E6-81C8-18CFB56F9DEF",variableType:4}
 */
var fMenores2 = 0;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"F1235313-E94E-43F1-A6EC-FC692A416B71",variableType:4}
 */
var fMenores = 0;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"67863216-7906-4E9D-81DB-26144C2C5BCE",variableType:4}
 */
var fPasajeros3 = 2;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"307B260E-C6DE-4E1A-B2E0-D20F65620E44",variableType:4}
 */
var fPasajeros2 = 2;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"9DA6CDF8-F305-4AA1-801B-E5BA6D709057",variableType:4}
 */
var fHabitaciones = 1;

/**
 * @type {Number}
 *
 * @properties={typeid:35,uuid:"6BD630CF-D8B1-4D75-A1E9-7B45C2789CD8",variableType:4}
 */
var fPasajeros = 2;

/**
 * @properties={typeid:24,uuid:"EDFDA60D-3B55-4E67-9C76-B419866F83C1"}
 */
function buscar()
{
	if (!globals.gFechaDesde|| !globals.gFechaHasta)
	{
		globals.DIALOGS.showWarningDialog('Aviso','Por favor indique la fecha de entrada y de salida', 'OK')
		return
	}
	
	if (!globals.gHotelId)
	{
		globals.DIALOGS.showWarningDialog('Aviso','Hotel no elegido', 'OK')
		return
	}
	
	if (globals.gClienteId == null)
	{
		globals.DIALOGS.showWarningDialog('Aviso','Cliente no elegido', 'OK')
		return
	}
	if (reserva_actual.reservas_to_reserva_detalle)
		reserva_actual.reservas_to_reserva_detalle.deleteAllRecords()
	
	globals.gCantPasajeros 	= fPasajeros
	globals.gCantMenores	= fMenores
	globals.gHabFaltantes 	= fHabitaciones
	globals.gHabitaciones	= fHabitaciones
	forms.reserva_2.elements.tab_resultados.removeAllTabs()
	//PRIMER HABITACION
	var $ds = obtenerHabitaciones(fPasajeros, fMenores)
	mostrarHabitaciones($ds, 'hab1', fPasajeros, fMenores)
	var $ds2
	var $ds3
	//SEGUNDA HABITACION, SI CORRESPONDE
	if (fHabitaciones >= 2)
	{
		$ds2 = obtenerHabitaciones(fPasajeros2, fMenores2)
		mostrarHabitaciones($ds2, 'hab2', fPasajeros2, fMenores2)

		//TERCER HABITACION, SI CORRESPONDE
		if (fHabitaciones == 3)
		{
			$ds3 = obtenerHabitaciones(fPasajeros3, fMenores3)
			mostrarHabitaciones($ds3, 'hab3', fPasajeros3, fMenores3)
		}
	}
	if ($ds.getMaxRowIndex() == 0 || ($ds2 != null && $ds2.getMaxRowIndex() == 0) || ($ds3 != null && $ds3.getMaxRowIndex() == 0))
	{
		forms.reserva_2.elements.tab_resultados.removeAllTabs()
		globals.DIALOGS.showWarningDialog(i18n.getI18NMessage('hoteleria.aviso'),i18n.getI18NMessage('hoteleria.aviso.noHabitacionesDisponibles'), 'OK')
		return
	}
	forms.reserva_2.controller.show()
}

/**
 * @param {Number} cant_pasajeros
 * @param {Number} cant_menores
 * 
 * @properties={typeid:24,uuid:"0E158B0A-1E96-4076-991C-096AA1C16984"}
 */
function obtenerHabitaciones(cant_pasajeros, cant_menores) {
	
	var $desde = new Date(globals.gFechaDesde.getFullYear(),globals.gFechaDesde.getMonth(), globals.gFechaDesde.getDate(),0,0,0,0)
	var $hasta = new Date(globals.gFechaHasta.getFullYear(),globals.gFechaHasta.getMonth(), globals.gFechaHasta.getDate()-1,0,0,0,0)
	var $temporadas = buscarTemporadas(globals.gFechaDesde, globals.gFechaHasta)
	//FALTA EL HOTEL
	var $query_disponibles = 'SELECT d.tipo_habitacion_id FROM disponibilidad "d" '+
								' JOIN tipos_habitacion "th" ON th.tipo_habitacion_id = d.tipo_habitacion_id '+
								' JOIN disponibilidad_detalle "dd" ON dd.disponibilidad_id = d.disponibilidad_id '+
								' WHERE th.limite_adulto >= ? '+
								' AND th.limite_menor >= ? '+
								' AND d.fecha BETWEEN ? AND ? '+
								' AND dd.tipo_cliente_id = ? AND dd.cantidad >= ?'+
								' AND th.es_habitacion = 1 '+
								' AND d.hotel_id = ? ' +
								' GROUP BY d.tipo_habitacion_id '+
								' HAVING COUNT(d.tipo_habitacion_id) = ?'
	if (globals.gClienteId == 0)
		var $tipo = 9999
	else
		var $tipo = clientes_conectado.tipo_cliente_id	
	var $cant_noches = globals.diferenciaDias($hasta,$desde)+1
	var $args = [cant_pasajeros, cant_menores, $desde, $hasta, $tipo, 1, globals.gHotelId, $cant_noches]
	
	var $query_tarifas = globals.gTarifasCliente
	
	var $query = 'SELECT p.tipo_habitacion_id, t.desayuno, t.tarifa_id, precio_menor_adic, MIN(pd.precio) as "precio", t.moneda_id, th.descripcion_corta '+
	  				'FROM precios "p" '+
	  				'JOIN precios_detalle "pd" ON pd.precio_id = p.precio_id '+
	  				'JOIN tarifas "t" ON t.tarifa_id = p.tarifa_id '+
	  				'JOIN tipos_habitacion "th" ON th.tipo_habitacion_id = p.tipo_habitacion_id '+
	  				'WHERE p.tipo_habitacion_id IN ( ' + $query_disponibles + ') '+
	  				'AND t.tarifa_id IN (' + $query_tarifas + ') '+
	  				'AND temporada_id IN ('+$temporadas+') '+
	  				'AND pd.cantidad = ? '+
					'AND p.hotel_id = ? '+
	  				'GROUP BY t.tarifa_id, t.desayuno, precio_menor_adic, p.tipo_habitacion_id, t.moneda_id, th.descripcion_corta '+
	  				'ORDER BY p.tipo_habitacion_id; '
	$args.push(cant_pasajeros)
	$args.push(globals.gHotelId)
	var $ds = databaseManager.getDataSetByQuery('hoteleria',$query,$args,-1)
	$ds.addColumn('precio_dls',7)
	$ds.addColumn('precio_real',9)
	$ds.addColumn('precio_real_dls',10)
	$ds.addColumn('descuento',11)
	$ds.addColumn('mensaje',12)
	
	for (var i = 1 ; i <= $ds.getMaxRowIndex() ; i++)
	{
		var $promos = globals.buscarPromosMinimo(globals.gFechaDesde, globals.gFechaHasta, globals.gTarifasCliente, $ds.getValue(i,1))
		if ($promos.getMaxRowIndex() == 0)
		{
			var $dias_promo = globals.hayPromocionDiaria(globals.gFechaDesde, $hasta, globals.gTarifasCliente, $ds.getValue(i,1))
		}
		
		var $precio = $ds.getValue(i,5)
		if (cant_menores > 0)
		{
			var $menor = $ds.getValue(i,4)
			$ds.setValue(i,5,$precio + $menor)
		}
		$precio = $ds.getValue(i,5)
		if ($ds.getValue(i,6) != 2)
		{
			$ds.setValue(i,7,$precio / globals.gCotizacion)
		}
		else
		{
			$ds.setValue(i,7,$precio)
			$ds.setValue(i,5,$precio * globals.gCotizacion)
		}
		if ($promos.getMaxRowIndex() > 0)
		{
			$ds.setValue(i,9,$ds.getValue(i,5))
			$ds.setValue(i,10,$ds.getValue(i,7))
			$ds.setValue(i,5,$ds.getValue(i,9) * (1 - ($promos.getValue(1,2) /100)))
			$ds.setValue(i,7,$ds.getValue(i,10) * (1 - ($promos.getValue(1,2) /100)))
			$ds.setValue(i,11,$promos.getValue(1,2)/100*(-1))
		}
		else
		{
			if ($dias_promo > 0)
			{
				$ds.setValue(i,12,i18n.getI18NMessage('hoteleria.promociones.tooltip.1') + ' ' + $dias_promo + ' ' + i18n.getI18NMessage('hoteleria.promociones.tooltip.2'))
			}
		}
	}
	
	return $ds
}

/**
 * @param {Date} fecha_desde
 * @param {Date} fecha_hasta
 * 
 * @properties={typeid:24,uuid:"FD1CED3B-956D-48EC-BD16-28FEA4487C22"}
 */
function buscarTemporadas(fecha_desde, fecha_hasta) 
{
	var fecha = new Date(fecha_desde.getFullYear(), fecha_desde.getMonth(),fecha_desde.getDate(),0,0,0,0)
	var $temps = ''
	//Es menor porque la noche del dia en q se va no se paga
	while (fecha <= fecha_hasta)
	{
		var $sql = 'SELECT temporada_id FROM temporadas WHERE fecha_inicial <= ? AND fecha_final >= ? AND hotel_id = ? ORDER BY cant_dias'
		var $args = [fecha, fecha, globals.gHotelId]
		var $ds = databaseManager.getDataSetByQuery('hoteleria',$sql,$args,1)
		var $temp = $ds.getValue(1,1)
		if ($temps.indexOf($temp) == -1)
		{
			$temps += $temp +','
		}
		fecha = new Date(fecha.getFullYear(), fecha.getMonth(),fecha.getDate()+1,0,0,0,0)
	}
	return $temps.substr(0,$temps.length-1)
}

/**
 * @param {JSDataSet} habitaciones
 * @param {String} nombre
 * @param {Number} pasajeros
 * @param {Number} menores
 * 
 * @properties={typeid:24,uuid:"F107C2C8-C536-4336-B43C-CEF0D5D1D31A"}
 */
function mostrarHabitaciones(habitaciones, nombre, pasajeros, menores)
{
	history.removeForm(nombre)
	solutionModel.removeForm(nombre)
	var $frm = solutionModel.cloneForm(nombre,solutionModel.getForm('reserva_2_hab'))
	var $tipos = [JSColumn.INTEGER,JSColumn.INTEGER,JSColumn.INTEGER,JSColumn.NUMBER,JSColumn.NUMBER, JSColumn.INTEGER, JSColumn.NUMBER, JSColumn.TEXT, JSColumn.NUMBER, JSColumn.NUMBER, JSColumn.NUMBER, JSColumn.TEXT]
	$frm.dataSource = habitaciones.createDataSource('RESERVA_'+nombre,$tipos)
	var $rel = crearRelacion(nombre + '_to_fotos', $frm.dataSource, 'db:/hoteleria/fotos')
	var $img = $frm.newLabel('',8,99,97,76)
	$img.dataProviderID = $rel + '.foto'
	$img.transparent 	= true
	$img.onAction		= $frm.getMethod('mostrarFotos')
	$img.showClick		= false
	$img.showFocus		= false
		
	forms[$frm.name].controller.recreateUI()
	forms[$frm.name].controller.sort('tipo_habitacion_id asc, precio asc')
	forms[$frm.name].fPasajeros = pasajeros
	forms[$frm.name].fMenores 	= menores
	var $nro = forms.reserva_2.elements.tab_resultados.getMaxTabIndex()+1
	forms[$frm.name].elements.lbl_resultados.text += ' '+i18n.getI18NMessage('hoteleria.habitacion')+' Nº '+$nro
	forms.reserva_2.elements.tab_resultados.addTab($frm.name, $frm.name, i18n.getI18NMessage('hoteleria.habitacion')+ ' ' + $nro)
}

/**
 * @param {String} nombre
 * @param {String} ds_origen
 * @param {String} ds_destino
 *
 * @properties={typeid:24,uuid:"3EB1A939-E98E-4C9C-8D88-B1A57F202EA5"}
 */
function crearRelacion(nombre, ds_origen, ds_destino)
{
	var $rel = solutionModel.getRelation(nombre)
	if ($rel == null)
	{
		$rel = solutionModel.newRelation(nombre, ds_origen, ds_destino, JSRelation.LEFT_OUTER_JOIN)
		$rel.allowCreationRelatedRecords = true
		var $pk = 'tipo_habitacion_id'
		$rel.newRelationItem($pk, '=', $pk)
	}
	return $rel.name
}

/**
 * Handle changed data.
 *
 * @param {Number} [oldValue] old value
 * @param {Number} [newValue] new value
 * @param {JSEvent} [event] the event that triggered the action
 *
 * @returns {Boolean}
 *
 * @properties={typeid:24,uuid:"E5959504-DA79-40BE-8BA7-F8228C78FC67"}
 */
function onDataChangeHabitaciones(oldValue, newValue, event) {
	if (fHabitaciones == 2)
	{
		elements.fld_hab2.visible = true
		elements.fld_hab3.visible = false
		if (ghotel_to_hoteles.edad_menor > 0)
		{
			elements.fld_menores2.visible = true
			elements.fld_menores3.visible = false
		}
	}
	else
		if (fHabitaciones == 3)
		{
			elements.fld_hab2.visible = true
			elements.fld_hab3.visible = true
			if (ghotel_to_hoteles.edad_menor > 0)
			{
				elements.fld_menores2.visible = true
				elements.fld_menores3.visible = true
			}
		}
		else
		{
			elements.fld_hab2.visible = false
			elements.fld_hab3.visible = false
			elements.fld_menores2.visible = false
			elements.fld_menores3.visible = false
			if (ghotel_to_hoteles.edad_menor > 0)
			{
				elements.fld_menores.visible = true
				elements.lbl_menores.visible = true
				elements.lbl_menores_edad.visible = true
			}
		}
	return true
}

/**
 *
 * @properties={typeid:24,uuid:"37AAF9F6-FE41-49CF-A1CF-DC7C1ECE215E"}
 */
function mostrarCalendarioHasta() {
	if (globals.gFechaDesde == null)
	{
		globals.DIALOGS.showWarningDialog(i18n.getI18NMessage('hoteleria.aviso'),i18n.getI18NMessage('hoteleria.aviso.fechaEntrada'),'OK')
		return
	}
	var $fDesde = new Date(globals.gFechaDesde.getFullYear(), globals.gFechaDesde.getMonth(),globals.gFechaDesde.getDate()+1, 0,0,0,0)
	var $fHasta = new Date(globals.gHoy.getFullYear(), globals.gHoy.getMonth(),globals.gHoy.getDate() + ghotel_to_hoteles.dias_tope, 0,0,0,0)
	var $form = globals.mostrarCalendarioMes(globals.gFechaDesde.getMonth()+1, globals.gFechaDesde.getFullYear(), $fDesde, $fHasta, 'POPUP', null, 'hoteleria_'+gcadena_to_cadenas.estilo)
	plugins.window.showFormPopup(elements.fld_fecha_desde,forms[$form],globals,'gFechaHasta')
}

/**
 * @properties={typeid:24,uuid:"AAD4D9E4-CDE3-4D66-8E6E-17D3ABB2A385"}
 */
function reiniciarBusqueda() {
	//forms.menu_principal.elements.btn_mi_reserva.visible = false
	elements.fld_hab2.visible 		= false
	elements.fld_hab3.visible 		= false
	fHabitaciones 	= 1
	fPasajeros 		= 2
	fPasajeros2 	= 2
	fPasajeros3 	= 2
	forms.reserva_2.elements.tab_resultados.removeAllTabs()
}

/**
 *
 * @properties={typeid:24,uuid:"800DC7B3-EA2A-48E7-B2A8-5F674CA17863"}
 */
function mostrarCalendarioDesde() {
	var $fDesde = new Date(globals.gHoy.getFullYear(), globals.gHoy.getMonth(),globals.gHoy.getDate(), 0,0,0,0)
	var $fHasta = new Date(globals.gHoy.getFullYear() +1, globals.gHoy.getMonth(),globals.gHoy.getDate(), 0,0,0,0)
	var $form = globals.mostrarCalendarioMes(globals.gHoy.getMonth()+1, globals.gHoy.getFullYear(), $fDesde, $fHasta, 'POPUP', null, 'hoteleria_'+gcadena_to_cadenas.estilo)
	plugins.window.showFormPopup(elements.fld_fecha_desde,forms[$form],globals,'gFechaDesde')
}

/**
 * Handle changed data.
 *
 * @param {Number} oldValue old value
 * @param {Number} newValue new value
 * @param {JSEvent} event the event that triggered the action
 *
 * @returns {Boolean}
 *
 * @properties={typeid:24,uuid:"78A1A405-1E8C-4D05-AA43-880BD15B9156"}
 */
function cambiaCliente(oldValue, newValue, event) {
	globals.gTarifasCliente = globals.buscarTarifas()
	return true
}

/**
 * @properties={typeid:24,uuid:"8CC17419-E19F-4A0C-B83E-2FB827A0C2E1"}
 */
function menores()
{
	forms.reserva_1.fTxtAdultos = i18n.getI18NMessage('i18n:hoteleria.adultos')+':'
	if (ghotel_to_hoteles.edad_menor == 0)
	{
		forms.reserva_1.fTxtAdultos = i18n.getI18NMessage('i18n:hoteleria.personas')+':'
		forms.reserva_1.elements.fld_menores.visible 		= false
		forms.reserva_1.elements.fld_menores2.visible 		= false
		forms.reserva_1.elements.fld_menores3.visible 		= false
		forms.reserva_1.elements.lbl_menores.visible 		= false
		forms.reserva_1.elements.lbl_menores_edad.visible 	= false
	}
}